package com.mp.negocio;

import com.mp.dao.HistoricoPrecoDAO;
import com.mp.db.jpa.modelo.GeoLocalizacao;
import com.mp.db.jpa.modelo.HistoricoPreco;
import com.mp.db.jpa.modelo.Item;
import com.mp.db.jpa.modelo.NomeclaturaLocal;
import com.mp.db.jpa.modelo.SessaoUsuario;
import com.mp.db.jpa.modelo.Usuario;
import com.mp.transporte.dto.EstatisticaVO;
import java.util.List;

public class HistoricoPrecoService 
{
    
    private HistoricoPrecoDAO   hpDAO  = new HistoricoPrecoDAO();
    
    //Serviços utilizados pelo próprio servico Historico de precos
    private NomeclaturaLocalService nomeclaturaLocalServico           = new NomeclaturaLocalService();
    private ItemService itServico                                     = new ItemService(); 
    private UsuarioService usrServico                                 = new UsuarioService(); 
    private SessaoUsuarioService sessaoUsuarioService                 = new SessaoUsuarioService(); 

    
    public HistoricoPreco obterHistoricoPreco(int id) throws Exception
    {
        HistoricoPreco hp = hpDAO.obterHistoricoPreco(id);
        
        if(hp == null)
        {
            throw new Exception("Historico Preco não encontrado na base de dados");    
        }
        else
        {
            return hp;
        }
        
    }
     
    
    public EstatisticaVO consultarListaHistoricoPrecoPorItem(Integer idSessao,Integer idItem) throws Exception
    {
        
        SessaoUsuario ssusr = sessaoUsuarioService.obterSessaoUsuario(idSessao);
        
        Item item = itServico.obterItem(idItem);
              
        List<HistoricoPreco> listaRetorno = hpDAO.obterListaHistoricoPrecoPorItem(item,ssusr.getUsuario());
        
        if(listaRetorno.isEmpty())
        {
            throw new Exception("Lista vazia de historico de preços para o item consultado.");            
        }
        else
        {
            
            //Para fins estatísticos
            List<HistoricoPreco> listaRetornoPrecosGeral = hpDAO.obterListaHistoricoPrecoPorItem(item);
            
            Double mediaColetiva = 0.0;
            Double mediaIndividual = 0.0;
            int contadorColetiva = 0;
            int contadorIndividual = 0;
            
            for(HistoricoPreco hc : listaRetornoPrecosGeral)
            {
                mediaColetiva = mediaColetiva + (hc.getValor() * hc.getQuantidade());
                
                contadorColetiva = contadorColetiva + hc.getQuantidade();
            }
            
            for(HistoricoPreco hi : listaRetorno)
            {
                mediaIndividual = mediaIndividual + (hi.getValor() * hi.getQuantidade());
                
                contadorIndividual = contadorIndividual + hi.getQuantidade();
            }
            
            EstatisticaVO objetoEstatistica = new EstatisticaVO();
            
            if(contadorColetiva != 0)
            {
                objetoEstatistica.setMediaColetiva(Double.toString(mediaColetiva / contadorColetiva));
            }    
            if(contadorIndividual != 0)
            {
                objetoEstatistica.setMediaIndividual(Double.toString(mediaIndividual / contadorIndividual));
            } 
            
            objetoEstatistica.setListaHistoricoPreco(listaRetorno);
            
            return objetoEstatistica; 
                      
        }
           
    }
        
    public List<HistoricoPreco> consultarListaHistoricoPrecoPorUsuario(Integer id) throws Exception
    {
        Usuario usrBanco = usrServico.obterUsuario(id);
        List<HistoricoPreco> listaRetorno = hpDAO.obterListaHistoricoPrecoPorUsuario(usrBanco);
        
        if(listaRetorno.isEmpty())
        {
            throw new Exception("Lista vazia de historico de preços para usuario consultado.");            
        }
        else
        {
            return listaRetorno;           
        }
           
    }
    
     public List<HistoricoPreco> consultarListaHistoricoPrecoPorNomeclaturaLocal(Integer idSessao,Integer idNomeclatura) throws Exception
    {
        
        sessaoUsuarioService.obterSessaoUsuario(idSessao);
        
        NomeclaturaLocal nomLocalBanco = nomeclaturaLocalServico.obterNomeclaturaLocal(idNomeclatura);
        
        List<HistoricoPreco> listaRetorno = hpDAO.obterListaHistoricoPrecoPorNomeclaturaLocal(nomLocalBanco);
        
        if(listaRetorno.isEmpty())
        {
            throw new Exception("Lista vazia de historico de preços para o local consultado.");            
        }
        else
        {
            return listaRetorno;           
        }
           
    }
     
       
     public EstatisticaVO consultarListaHistoricoPrecoPorNomeclaturaLocalItem(Integer idSessao,Integer idNomeclaturaLocal,Integer idItem) throws Exception
     {
        
        sessaoUsuarioService.obterSessaoUsuario(idSessao);
        
        //Obtendo as referencias passadas.
        NomeclaturaLocal nomLocal = nomeclaturaLocalServico.obterNomeclaturaLocal(idNomeclaturaLocal);
        Item item = itServico.obterItem(idItem);
         
        List<HistoricoPreco> listaRetorno = hpDAO.obterHistoricoPrecoPorNomeclaturaLocalItem(idNomeclaturaLocal,idItem);
        
        if(listaRetorno.isEmpty())
        {
            throw new Exception("Lista vazia de historico de preços para usuario consultado.");            
        }
        else
        {
            
             //Para fins estatísticos
            List<HistoricoPreco> listaRetornoPrecosGeoItem = hpDAO.obterListaHistoricoPrecoPorGeoLocalizacaoItem(nomLocal.getGeoLocalizacao(),item);
            
            Double mediaColetiva = 0.0;
            Double mediaIndividual = 0.0;
            int contadorColetiva = 0;
            int contadorIndividual = 0;
            
            for(HistoricoPreco hc : listaRetornoPrecosGeoItem)
            {
                mediaColetiva = mediaColetiva + (hc.getValor() * hc.getQuantidade());
                
                contadorColetiva = contadorColetiva + hc.getQuantidade();
            }
            
            for(HistoricoPreco hi : listaRetorno)
            {
                mediaIndividual = mediaIndividual + (hi.getValor() * hi.getQuantidade());
                
                contadorIndividual = contadorIndividual + hi.getQuantidade();
            }
            
            EstatisticaVO objetoEstatistica = new EstatisticaVO();
            
            if(contadorColetiva != 0)
            {
                objetoEstatistica.setMediaColetiva(Double.toString(mediaColetiva / contadorColetiva));
            }    
            if(contadorIndividual != 0)
            {
                objetoEstatistica.setMediaIndividual(Double.toString(mediaIndividual / contadorIndividual));
            } 
            
            objetoEstatistica.setListaHistoricoPreco(listaRetorno);
            
            return objetoEstatistica;           
        }
        
       
        
     }
    
    
    public void gravarHistoricoPreco(Integer idSessao,Integer idNomeclaturaLocal,Integer idItem,Integer  qtd, Double valor) throws Exception
    {
        
        sessaoUsuarioService.obterSessaoUsuario(idSessao);
        
        Item it = itServico.obterItem(idItem); 
        NomeclaturaLocal nomLoc = nomeclaturaLocalServico.obterNomeclaturaLocal(idNomeclaturaLocal);
        
        GeoLocalizacao geoLocalizacao = new GeoLocalizacao();
        geoLocalizacao.setDescLatitude("-46,12355");
        geoLocalizacao.setDescLongitude("-42,98547");
        
        //Gravando o preco com base nas referencias obtidas acima
        HistoricoPreco hp = new HistoricoPreco();
        hp.setItem(it);
        hp.setNomeclaturaLocal(nomLoc);
        hp.setQuantidade(qtd);
        hp.setValor(valor);
       
        hpDAO.gravarHistoricoPreco(hp);
        
    }
    

    private List<HistoricoPreco> formatarDataHistoricoPreco(List<HistoricoPreco> lista)
    {
        
        for(HistoricoPreco h : lista)
        {
            
        }
                
      return null;  
    }
    
    
}
